package com.fucking.great.context.single;

import cn.hutool.core.map.MapUtil;
import cn.hutool.log.Log;
import cn.hutool.log.LogFactory;
import com.fucking.great.context.util.SingleUtil;

import java.util.Map;

/**
 * 该类型单例工厂:
 * 用于初始化，单例类型的对象。
 * 生成的key为
 * classType 生成的key的名称 ，和实例化对象的类型
 */
public abstract class ClassSingleFactory implements SingleFactory {
    public static final Log logger = LogFactory.get();
    /**
     * 单例的类型。
     */
    private final Class<?> singleClassType;
    /**
     * 是否覆盖。
     */
    private final boolean cover;


    /**
     * @param singleClassType 生成的key的名称 ，和实例化对象的类型
     * @param cover  是否强制覆盖。
     */
    public ClassSingleFactory(Class<?> singleClassType, boolean cover) {
        this.singleClassType = singleClassType;
        this.cover = cover;
    }

    @Override
    public final Map<String,Object> getNeedRegsigAllBean(Map<String,Object> storageCenter) {
        // 对应的key
        String toKey = SingleUtil.classToKey(this.singleClassType);
        // 直接操作 单例中心.
        Object remove = null;
        if(this.cover){
            remove = storageCenter.remove(toKey);
        }
        //
        Object t = this.newInstance();
        //
        Object ifAbsent = storageCenter.putIfAbsent(toKey, t);
        logger.info("该单例工厂[{}],目标实例化类[{}],是否覆盖[{}],从中心移除的对象[{}],该工厂实例化的对象[{}],放入单例存储中心是否成功[{}]",
                this.getClass(),this.singleClassType,this.cover,remove,t,ifAbsent == null);
//        if(ifAbsent != null){
//            TxnRuntimeException.throwException("GREAT_SIGNLE_REGSIG_BEAN_EXIST",
//                    StrUtil.format("该bean以存在请检查,该单例工厂[{}],目标实例化类[{}],是否覆盖[{}]",this.getClass(),this.classType,this.cover));
//        }
        // 不需要返回
        return MapUtil.empty();
    }

    protected abstract Object newInstance();


    public Class<?> getSingleClassType() {
        return singleClassType;
    }

    public boolean isCover() {
        return cover;
    }
}
